#include <string>
#include <iostream>

class Sales_data
{
    // 为Sales_data 的非成员函数所作的友元声明
    friend Sales_data add(const Sales_data &, const Sales_data &);
    friend std::istream &read(std::istream &, Sales_data &);
    friend std::ostream &print(std::ostream &, const Sales_data &);

public: // 添加访问限定符
    // 新增的构造函数
    Sales_data() = default;
    // 定义默认构造函数，令其与只接受一个 string 实参的构造函数功能相同
    Sales_data(std::string s = "") : bookNo(s) {}
    Sales_data(const std::string &s) : bookNo(s) {}
    Sales_data(const std::string &s, unsigned n, double p) : bookNo(s), units_sold(n), revenue(p * n) {}
    Sales_data(std::istream &);
    // Sales_data(std::istream &is = std::cin) { is >> *this }
    // 新成员：关于 Sales_data 对象的操作
    std::string isbn() const { return bookNo; }
    Sales_data &combine(const Sales_data &);
    double avg_price() const;
private: // 添加访问限定符
    // 数据成员和之前相比没有改变
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};
Sales_data::Sales_data(std::istream &is)
{
    read(is, *this); // read 函数的作用是从is中读取一条交易信息然后存入this对象中
}
// Sale_data 接口的非成员函数组成部分的声明
Sales_data add(const Sales_data &, const Sales_data &);
std::istream &read(std::istream &, Sales_data &);
std::ostream &print(std::ostream &, const Sales_data &);

// 实现部分
inline double Sales_data::avg_price() const
{
    if (units_sold)
    {
        return revenue / units_sold;
    }
    else
    {
        return 0;
    }
}